package com.qinyeit.serviceapp.service.system.impl;

import com.alibaba.fastjson.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.qinyeit.serviceapp.exception.BusinessRunTimeException;
import com.qinyetech.springstage.core.lang.QyMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 发送短信
 * Created by liyang on 2016/09/01.
 */
@Service("smsService")
public class SmsServiceImpl {


    private Log log = LogFactory.getLog(SmsServiceImpl.class);

    @Value("${sms.accessId:}")
    private String accessId;

    @Value("${sms.accessKey:}")
    private String accessKey;

    private static final String product = "Dysmsapi";

    private static final String domain = "dysmsapi.aliyuncs.com";

    @Value("${sms.signName:}")
    private String signName;

    /**
     * 发送短信
     * @param mobile 接受的手机号 用英文逗号分隔 最大长度为 1000
     * @param templateId 短信模板消息ID
     * @param param 短信模板消息参数
     */
    public void sendSingleMsg(String templateId, String mobile, QyMap param){
        try{
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            log.info("accessId>>>>>>>>>>>>>>>>>"+accessId+"");
            log.info("accessKey>>>>>>>>>>>>>>>>>"+accessKey+"");
            //初始化ascClient,暂时不支持多region（请勿修改）
            IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessId, accessKey);
            //初始化ascClient需要的几个参数
            //短信API产品名称（短信产品名固定，无需修改）
            //短信API产品域名（接口地址固定，无需修改）
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            //组装请求对象
            SendSmsRequest request = new SendSmsRequest();
            //使用post提交
            request.setMethod(MethodType.POST);
            //必填:待发送手机号。支持以逗号分隔的形式进行批量调用，批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式；发送国际/港澳台消息时，接收号码格式为00+国际区号+号码，如“0085200000000”
            request.setPhoneNumbers(mobile);
            //必填:短信签名-可在短信控制台中找到
            //短信模板前辍
            request.setSignName(signName);
            //必填:短信模板-可在短信控制台中找到，发送国际/港澳台消息时，请使用国际/港澳台短信模版
            request.setTemplateCode(templateId);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
            request.setTemplateParam(JSON.toJSONString(param));
            //可选-上行短信扩展码(扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段)
            //request.setSmsUpExtendCode("90997");
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
//            request.setOutId("yourOutId");
            //请求失败这里会抛ClientException异常
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            log.info("use template "+templateId+" send sms to "+mobile);
            log.info(JSON.toJSON(sendSmsResponse));
            String rc = sendSmsResponse.getCode();
            if(rc != null) {
                if(sendSmsResponse.getCode().equals("OK")){
                    //发送成功
                }else{
                    throw new BusinessRunTimeException(errorCode(rc), 710003);
                }
            }else{
                throw new BusinessRunTimeException("请求失败", 710002);
            }
        }catch (Exception e){
            //发送失败
            throw new BusinessRunTimeException(e.getMessage(), 710001);
        }
    }

    //短信错误码
    private String errorCode(String code){
        QyMap map = QyMap.NEW();
        map.setv("OK","请求成功");
        map.setv("isp.RAM_PERMISSION_DENY","RAM权限DENY");
        map.setv("isv.OUT_OF_SERVICE","业务停机");
        map.setv("isv.PRODUCT_UN_SUBSCRIPT","未开通云通信产品的阿里云客户");
        map.setv("isv.PRODUCT_UNSUBSCRIBE","产品未开通");
        map.setv("isv.ACCOUNT_NOT_EXISTS","账户不存在");
        map.setv("isv.ACCOUNT_ABNORMAL","账户异常");
        map.setv("isv.SMS_TEMPLATE_ILLEGAL","短信模板不合法");
        map.setv("isv.SMS_SIGNATURE_ILLEGAL","短信签名不合法");
        map.setv("isv.INVALID_PARAMETERS","参数异常");
        map.setv("isp.SYSTEM_ERROR","系统错误");
        map.setv("isv.MOBILE_NUMBER_ILLEGAL","非法手机号");
        map.setv("isv.MOBILE_COUNT_OVER_LIMIT","手机号码数量超过限制");
        map.setv("isv.TEMPLATE_MISSING_PARAMETERS","模板缺少变量");
        map.setv("isv.BUSINESS_LIMIT_CONTROL","业务限流");
        map.setv("isv.INVALID_JSON_PARAM","JSON参数不合法，只接受字符串值");
        map.setv("isv.BLACK_KEY_CONTROL_LIMIT","黑名单管控");
        map.setv("isv.PARAM_LENGTH_LIMIT","参数超出长度限制");
        map.setv("isv.PARAM_NOT_SUPPORT_URL","不支持URL");
        map.setv("isv.AMOUNT_NOT_ENOUGH","账户余额不足");
        if(map.has(code)){
            return map.getString(code);
        }
        return "未知错误";
    }

    //身份验证验证码 验证码${code}，您正在进行身份验证，打死不要告诉别人哦！
    public String getProfileTemplateId(){
        return "SMS_140785040";
    }
    //登录确认验证码 验证码${code}，您正在登录，若非本人操作，请勿泄露。
    public String getLoginConfirmTemplateId(){
        return "SMS_140785039";
    }
    //登录异常验证码 验证码${code}，您正尝试异地登录，若非本人操作，请勿泄露。
    public String getLoginErrorTemplateId(){
        return "SMS_140785038";
    }
    //用户注册验证码   验证码${code}，您正在注册成为新用户，感谢您的支持！
    public String getRegisteredTemplateId(){
        return "SMS_140785037";
    }
    //修改密码验证码 验证码${code}，您正在尝试修改登录密码，请妥善保管账户信息。
    public String getModifyPwdTemplateId(){
        return "SMS_140785036";
    }
    //信息变更验证码 验证码${code}，您正在尝试变更重要信息，请妥善保管账户信息。
    public String getModifyProfileTemplateId(){
        return "SMS_140785035";
    }

}
